package com.xblibo.xruth.common;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;

/**
 * <p>Title: BaseModel.java</p>
 * <p>Description: 实体基类，所有实体都必须继承该类</p>
 * <p>Copyright: xb  2011* 版权所有 </p>    
 * @author xb
 * @version 1.0 , 2011-1-5下午02:46:06
 */
@MappedSuperclass
public class BaseEntity implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/**
	 * 实体id，唯一标识
	 */
	@Id
    @GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	/**
	 * 版本号     用于hibernate乐观锁
	 */
	@Version
    private Integer optimistic;
	
	/**
	 * 所属公司id
	 */
	@Column(name="company_id",length=20)
	private Integer companyId;
	
	/**
	 * 所属公司名称
	 */
	@Column(name="company_name",length=20)
	private String companyName;

	/**
	  * 重写equals必须注意：
	  * 1 自反性：对于任意的引用值x，x.equals(x)一定为true
	  * 2 对称性：对于任意的引用值x 和 y，当x.equals(y)返回true，y.equals(x)也一定返回true
	  * 3 传递性：对于任意的引用值x、y和ｚ，如果x.equals(y)返回true，并且y.equals(z)也返回true，那么x.equals(z)也一定返   回 true
	  * 4 一致性：对于任意的引用值x 和 y，如果用于equals比较的对象信息没有被修改，多次调用x.equals(y)要么一致地返回true，要么一致地返回false
	  * 5 非空性：对于任意的非空引用值x，x.equals(null)一定返回false
	  *　
	  * 请注意：
	  * 重写equals方法后最好重写hashCode方法，否则两个等价对象可能得到不同的hashCode,这在集合框架中使用可能产生严重后果
	  */
	@Override
	public boolean equals(Object other) {
		//先检查是否其自反性，后比较other是否为空。这样效率高
		if(this == other)                                      
			return true;
		if(other == null)   //非空性      
			return false;
		if(other.getClass()!= this.getClass())
			return false;
		final BaseEntity model = (BaseEntity)other;
		if( getId().equals(model.getId()))
		   return true;
		return super.equals(other);	   
	}
	/**
	 * hashCode主要是用来提高hash系统的查询效率。当hashCode中不进行任何操作时，可以直接让其返回 一常数，或者不进行重写。
	 */
	@Override
	public int hashCode() {
		return 100*getId().hashCode()+super.hashCode();
	}

	@Override
	public String toString() {
		return "id: "+getId()+" companyId: "+getCompanyId()+" companyName: "+getCompanyName();
	}

	
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getOptimistic() {
		return optimistic;
	}

	public void setOptimistic(Integer optimistic) {
		this.optimistic = optimistic;
	}

	public Integer getCompanyId() {
		return companyId;
	}

	public void setCompanyId(Integer companyId) {
		this.companyId = companyId;
	}

	public String getCompanyName() {
		return companyName;
	}

	public void setCompanyName(String companyName) {
		this.companyName = companyName;
	}
	
	
	

}
